package co.edu.uniandes.autoadaptacion.mbroker.checker;

import java.util.ArrayList;
import java.util.List;

import co.edu.uniandes.autoadaptacion.mbroker.checker.rule.IRule;
import co.edu.uniandes.autoadaptacion.mbroker.checker.rule.RuleA;
import co.edu.uniandes.autoadaptacion.mbroker.matrix.Matrix;

public class RulesThread implements Runnable{

	private List<IRule> rulesList;
	private Matrix im;
	
	/**
	 * Recorre todas las reglas, obtiene los que cumplan y luego selecciona uno.
	 * @return
	 */
	public RulesThread() {
		im = Matrix.getInstance();
		synchronized (Checker.class) {
			rulesList = new ArrayList<IRule>();
			rulesList.add(RuleA.getInstance());			
		}
	}
	
	@Override
	public void run(){
		boolean success = false;
		try {
			System.out.println("RulesThread::Verifying rules");
			while(true){
				// Verifica q todos cumplan
				for(IRule rule : rulesList){
					success = rule.verifyScenarios();
					if(!success){
						break;
					}
				}
				
				// Si alguno no cumple se debe retornar la lista de cumplidores
				// en todas las reglas.
				if(!success){
					System.out.println("RulesThread::Some fail - Getting all services");
					int[] contadorCumplidores = new int[im.getServiceMatrixLenght()];
					for(IRule rule : rulesList){
						rule.returnAccomplishServices(contadorCumplidores);						
					}
					(new Selector(im)).selectService(contadorCumplidores, rulesList.size(), -1);
				}
								
				// Validando la disponibilidad de los servicios
				
				
				System.out.println("RulesThread::run::sleep");
				Thread.sleep(5000);
			}			
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}
